Prepare county level data
Merge data
# create sequence of dates
date_sequence <- seq.Date(min(df_us_prev$date),
max(df_us_prev$date), 1)
# create data frame with time sequence
df_dates = data.frame(date_sequence, 1:length(date_sequence))
names(df_dates) <- c('date', 'time')
# join data frames
df_us_prev <- df_us_prev %>%
plyr::join(df_us_ctrl, by='county_fips') %>%
plyr::join(df_us_pers, by='county_fips') %>%
merge(df_dates, by='date') %>%
arrange(county_fips, date)
df_us_prev
# create sequence of dates
date_sequence <- seq.Date(min(df_us_socdist$date),
max(df_us_socdist$date), 1)
# create data frame with time sequence
df_dates = data.frame(date_sequence, 1:length(date_sequence))
names(df_dates) <- c('date', 'time')
# join data frames
df_us_socdist <- df_us_socdist %>%
plyr::join(df_us_ctrl, by='county_fips') %>%
plyr::join(df_us_pers, by='county_fips') %>%
merge(df_dates, by='date') %>%
arrange(county_fips, date)
fips_complete <- df_us_socdist %>%
group_by(county_fips) %>%
summarize(n = n()) %>%
filter(! n<max(n)) %>% .$county_fips
df_us_socdist <- df_us_socdist %>%
filter(county_fips %in% fips_complete)
df_us_socdist
Control for weekend effect
df_us_loess <- df_us_socdist %>%
mutate(weekday = format(date, '%u')) %>%
filter(!weekday %in% c('6','7')) %>%
split(.$county_fips) %>%
map(~ loess(socdist_single_tile ~ time, data = .)) %>%
map(predict, 1:max(df_us_socdist$time)) %>%
bind_rows() %>%
gather(key = 'county_fips', value = 'loess') %>%
group_by(county_fips) %>%
mutate(time = row_number())
df_us_socdist <- df_us_socdist %>% merge(df_us_loess, by=c('county_fips', 'time')) %>%
mutate(weekday = format(date, '%u')) %>%
mutate(socdist_single_tile_clean = ifelse(weekday %in% c('6','7'), loess,
socdist_single_tile)) %>%
arrange(county_fips, time) %>%
select(-weekday)
df_us_socdist <- df_us_socdist %>% drop_na() %>% mutate(time = time-1)
Plot prevalence over time
df_us_prev %>% sample_n(20000) %>%
ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall prevalence over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_us_prev %>%
mutate(prev_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm=T),
quantile(.[[i]], 0.95, na.rm=T), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(prev_tail != 'center') %>%
ggplot(aes(x=time, y=rate_day)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~prev_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





Plot social distancing single tile visited
df_us_socdist %>% sample_n(10000) %>%
ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
theme(legend.position="none") +
ggtitle("Overall social distancing (single tile) over time")

pers <- c('pers_o', 'pers_c', 'pers_e', 'pers_a', 'pers_n')
for (i in pers){
gg <- df_us_socdist %>%
mutate(dist_tail = cut(.[[i]],
breaks = c(-Inf, quantile(.[[i]], 0.05, na.rm = T),
quantile(.[[i]], 0.95, na.rm = T), Inf),
labels = c('lower tail', 'center', 'upper tail'))) %>%
filter(dist_tail != 'center') %>%
ggplot(aes(x=time, y=socdist_single_tile_clean)) +
geom_point(aes(col=county_fips, size=popdens)) +
geom_smooth(method="loess", se=T) +
facet_wrap(~dist_tail) +
theme(legend.position="none") +
ggtitle(i)
print(gg)
}





df_us_socdist <- df_us_socdist %>% mutate(socdist_single_tile = socdist_single_tile_clean) %>%
select(-loess, -socdist_single_tile_clean)
Correlations
df_us_prev %>% select(-time, -date) %>%
group_by(county_fips) %>%
summarize_if(is.numeric, mean) %>%
select(-county_fips) %>%
cor(use='pairwise.complete.obs') %>%
round(3) %>% as.data.frame()
df_us_socdist %>% select(-time, -date) %>%
group_by(county_fips) %>%
summarize_if(is.numeric, mean) %>%
select(-county_fips) %>%
cor(use='pairwise.complete.obs') %>%
round(3) %>% as.data.frame()
NA
Rescale Data
lvl2_scaled <- df_us_prev %>%
select(-time, -date, -rate_day) %>%
distinct() %>%
mutate_at(vars(-county_fips), scale)
lvl1_scaled <- df_us_prev %>% select(county_fips, time, rate_day)
df_us_prev_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')
lvl2_scaled <- df_us_socdist %>%
select(-time, -date, -socdist_tiles, -socdist_single_tile) %>%
distinct() %>%
mutate_at(vars(-county_fips), scale)
lvl1_scaled <- df_us_socdist %>% select(county_fips, time, socdist_single_tile)
df_us_socdist_scaled <- plyr::join(lvl1_scaled, lvl2_scaled, by = 'county_fips')
Predict Prevalence
Explore distributions
df_us_onset_prev %>% ggplot(aes(onset_prev)) + geom_histogram(bins = 100)

df_us_slope_prev %>% ggplot(aes(slope_prev)) + geom_histogram(bins = 100)

Predict COVID onset with time-to-event regression
# predict onset from personality
cox_onset_prev <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_onset_prev)
cox_onset_prev %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e +
pers_a + pers_n, data = df_us_onset_prev)
n= 2469, number of events= 2429
(440 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.25801 1.29435 0.01953 13.214 < 2e-16 ***
pers_c 0.01242 1.01250 0.02440 0.509 0.6107
pers_e 0.04044 1.04127 0.01961 2.062 0.0392 *
pers_a 0.02804 1.02844 0.02404 1.167 0.2434
pers_n -0.13832 0.87082 0.02214 -6.248 4.17e-10 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.2944 0.7726 1.2458 1.3448
pers_c 1.0125 0.9877 0.9652 1.0621
pers_e 1.0413 0.9604 1.0020 1.0821
pers_a 1.0284 0.9723 0.9811 1.0781
pers_n 0.8708 1.1483 0.8338 0.9094
Concordance= 0.658 (se = 0.006 )
Likelihood ratio test= 280.5 on 5 df, p=<2e-16
Wald test = 282.1 on 5 df, p=<2e-16
Score (logrank) test = 280.1 on 5 df, p=<2e-16
# predict onset from personality with controls
cox_onset_prev_ctrl <- coxph(Surv(onset_prev, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_onset_prev)
cox_onset_prev_ctrl %>% summary()
Call:
coxph(formula = Surv(onset_prev, event) ~ pers_o + pers_c + pers_e +
pers_a + pers_n + airport_distance + republican + medage +
male + popdens + manufact + tourism + academics + medinc +
physician_pc, data = df_us_onset_prev)
n= 2464, number of events= 2424
(445 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o 0.219404 1.245334 0.024013 9.137 < 2e-16 ***
pers_c 0.074751 1.077615 0.026097 2.864 0.004179 **
pers_e 0.016376 1.016510 0.020873 0.785 0.432729
pers_a 0.042856 1.043787 0.026698 1.605 0.108444
pers_n 0.001372 1.001373 0.025862 0.053 0.957701
airport_distance -0.293113 0.745938 0.029875 -9.811 < 2e-16 ***
republican -0.181505 0.834014 0.025588 -7.093 1.31e-12 ***
medage -0.277857 0.757405 0.022256 -12.484 < 2e-16 ***
male -0.145115 0.864923 0.028091 -5.166 2.39e-07 ***
popdens -0.090498 0.913477 0.024988 -3.622 0.000293 ***
manufact 0.046112 1.047192 0.024014 1.920 0.054827 .
tourism 0.068927 1.071358 0.021260 3.242 0.001186 **
academics 0.052582 1.053989 0.036863 1.426 0.153748
medinc 0.308101 1.360838 0.032191 9.571 < 2e-16 ***
physician_pc -0.107555 0.898027 0.022305 -4.822 1.42e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 1.2453 0.8030 1.1881 1.3053
pers_c 1.0776 0.9280 1.0239 1.1342
pers_e 1.0165 0.9838 0.9758 1.0590
pers_a 1.0438 0.9580 0.9906 1.0999
pers_n 1.0014 0.9986 0.9519 1.0534
airport_distance 0.7459 1.3406 0.7035 0.7909
republican 0.8340 1.1990 0.7932 0.8769
medage 0.7574 1.3203 0.7251 0.7912
male 0.8649 1.1562 0.8186 0.9139
popdens 0.9135 1.0947 0.8698 0.9593
manufact 1.0472 0.9549 0.9990 1.0977
tourism 1.0714 0.9334 1.0276 1.1169
academics 1.0540 0.9488 0.9805 1.1330
medinc 1.3608 0.7348 1.2776 1.4495
physician_pc 0.8980 1.1136 0.8596 0.9382
Concordance= 0.735 (se = 0.005 )
Likelihood ratio test= 998.1 on 15 df, p=<2e-16
Wald test = 1107 on 15 df, p=<2e-16
Score (logrank) test = 1225 on 15 df, p=<2e-16
Predict prevalence slopes with linear models
# predict slopes from personality
lm_slope_prev <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_slope_prev)
lm_slope_prev %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_us_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-0.08820 -0.03714 -0.02402 -0.00237 2.96494
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.048019 0.002665 18.016 < 2e-16 ***
pers_o -0.006137 0.003041 -2.018 0.04371 *
pers_c -0.002526 0.003685 -0.685 0.49311
pers_e -0.002132 0.003058 -0.697 0.48581
pers_a 0.010416 0.003754 2.774 0.00558 **
pers_n -0.005947 0.003448 -1.725 0.08468 .
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1265 on 2254 degrees of freedom
Multiple R-squared: 0.01033, Adjusted R-squared: 0.008138
F-statistic: 4.707 on 5 and 2254 DF, p-value: 0.0002796
# predict slopes from personality with controls
lm_slope_prev_ctrl <- lm(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_slope_prev)
lm_slope_prev_ctrl %>% summary()
Call:
lm(formula = slope_prev ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc,
data = df_us_slope_prev)
Residuals:
Min 1Q Median 3Q Max
-0.22382 -0.03886 -0.01734 0.00683 2.79539
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.046634 0.002760 16.894 < 2e-16 ***
pers_o -0.001848 0.003533 -0.523 0.60097
pers_c -0.002344 0.003688 -0.636 0.52502
pers_e -0.001526 0.003058 -0.499 0.61775
pers_a 0.010595 0.003873 2.735 0.00628 **
pers_n -0.003037 0.003719 -0.817 0.41420
airport_distance 0.005851 0.003655 1.601 0.10952
republican -0.013491 0.003300 -4.088 4.50e-05 ***
medage -0.008880 0.002915 -3.047 0.00234 **
male 0.008961 0.003493 2.566 0.01036 *
popdens 0.007500 0.002733 2.744 0.00611 **
manufact 0.010568 0.003207 3.295 0.00100 **
tourism 0.001337 0.003518 0.380 0.70401
academics -0.011711 0.005040 -2.323 0.02025 *
medinc 0.012500 0.004258 2.936 0.00336 **
physician_pc 0.013890 0.002918 4.760 2.06e-06 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.1242 on 2244 degrees of freedom
Multiple R-squared: 0.05072, Adjusted R-squared: 0.04437
F-statistic: 7.993 on 15 and 2244 DF, p-value: < 2.2e-16
CRF predicting slopes
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_slope_prev <- cforest(slope_prev ~ pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_slope_prev,
controls = ctrls)
crf_slope_prev_varimp <- varimp(crf_slope_prev, nperm = 1)
crf_slope_prev_varimp_cond <- varimp(crf_slope_prev, conditional = T, nperm = 1)
crf_slope_prev_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_slope_prev_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

Predict Social Distancing
Change point analysis
# keep only counties with full data
fips_complete <- df_us_socdist_scaled %>%
group_by(county_fips) %>%
summarize(n = n()) %>%
filter(n==max(.$n)) %>%
.$county_fips
# run changepoint analysis
df_us_socdist_cpt_results <- df_us_socdist_scaled %>%
select(county_fips, socdist_single_tile) %>%
filter(county_fips %in% fips_complete) %>%
split(.$county_fips) %>%
map(~ cpt.meanvar(as.vector(.$socdist_single_tile),
#penalty = 'Asymptotic',
class=TRUE,
param.estimates=TRUE,
Q=1,
test.stat = 'Normal'))
# calculate change point
df_us_socdist_cpt_day <- df_us_socdist_cpt_results %>%
map(cpts) %>%
unlist() %>%
as.data.frame() %>%
rename(cpt_day_socdist = '.') %>%
rownames_to_column('county_fips')
# calculate mean differences
df_us_socdist_cpt_mean_diff <- df_us_socdist_cpt_results %>%
map(param.est) %>%
map(~ .$mean) %>%
map(~ .[2]-.[1]) %>%
unlist() %>%
as.data.frame() %>%
rename(mean_diff_socdist = '.') %>%
rownames_to_column('county_fips')
# calculate varaince differences
df_us_socdist_cpt_var_diff <- df_us_socdist_cpt_results %>%
map(param.est) %>%
map(~ .$variance) %>%
map(~ .[2]-.[1]) %>%
unlist() %>%
as.data.frame() %>%
rename(var_diff_socdist = '.') %>%
rownames_to_column('county_fips')
# merge with county data
df_us_cpt_socdist <- df_us_socdist_scaled %>%
select(-time, -socdist_single_tile) %>%
distinct() %>%
left_join(df_us_socdist_cpt_day, by='county_fips') %>%
left_join(df_us_socdist_cpt_mean_diff, by='county_fips') %>%
left_join(df_us_socdist_cpt_var_diff, by='county_fips') %>%
left_join(select(df_us_onset_prev, county_fips, onset_prev), by='county_fips') %>%
left_join(select(df_us_slope_prev, county_fips, slope_prev), by='county_fips')
# handle censored data
df_us_cpt_socdist <- df_us_cpt_socdist %>%
mutate(cpt_day_socdist = ifelse(is.na(cpt_day_socdist), as.numeric(diff(range(df_us$date))), cpt_day_socdist)) %>%
mutate(event = ifelse(cpt_day_socdist >= 60, 0, 1))
df_us_cpt_socdist$cpt_day_socdist %>% hist()

df_us_cpt_socdist$mean_diff_socdist %>% hist()

df_us_cpt_socdist$var_diff_socdist %>% hist()

for(i in head(df_us_socdist_cpt_results, 5)){
plot(i)
}




NA

Predicting change points with time-to-event regression
# predict hazard from personality
cox_cpt_socdist <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
cox_cpt_socdist %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n, data = df_us_cpt_socdist)
n= 2380, number of events= 2379
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.15153 0.85939 0.02244 -6.754 1.44e-11 ***
pers_c -0.02846 0.97194 0.02681 -1.062 0.28843
pers_e 0.02941 1.02985 0.02358 1.247 0.21226
pers_a -0.08052 0.92264 0.02767 -2.910 0.00361 **
pers_n 0.08166 1.08508 0.02678 3.050 0.00229 **
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.8594 1.1636 0.8224 0.8980
pers_c 0.9719 1.0289 0.9222 1.0244
pers_e 1.0299 0.9710 0.9833 1.0786
pers_a 0.9226 1.0838 0.8739 0.9741
pers_n 1.0851 0.9216 1.0296 1.1435
Concordance= 0.582 (se = 0.008 )
Likelihood ratio test= 107.2 on 5 df, p=<2e-16
Wald test = 109.7 on 5 df, p=<2e-16
Score (logrank) test = 109.3 on 5 df, p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + airport_distance + republican +
medage + male + popdens + manufact + tourism + academics +
medinc + physician_pc, data = df_us_cpt_socdist)
n= 2380, number of events= 2379
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.094909 0.909456 0.026471 -3.585 0.000337 ***
pers_c -0.024506 0.975792 0.027403 -0.894 0.371167
pers_e 0.035056 1.035678 0.023966 1.463 0.143539
pers_a -0.091709 0.912370 0.029044 -3.158 0.001591 **
pers_n 0.071328 1.073933 0.029010 2.459 0.013942 *
airport_distance 0.049305 1.050541 0.024199 2.037 0.041606 *
republican 0.046018 1.047093 0.025565 1.800 0.071850 .
medage 0.039634 1.040430 0.020516 1.932 0.053374 .
male 0.008525 1.008561 0.021596 0.395 0.693038
popdens -0.130542 0.877620 0.038711 -3.372 0.000746 ***
manufact 0.102368 1.107792 0.023238 4.405 1.06e-05 ***
tourism -0.073016 0.929586 0.024515 -2.978 0.002898 **
academics 0.167903 1.182822 0.040263 4.170 3.04e-05 ***
medinc -0.086244 0.917370 0.033798 -2.552 0.010718 *
physician_pc -0.020033 0.980166 0.023267 -0.861 0.389235
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.9095 1.0996 0.8635 0.9579
pers_c 0.9758 1.0248 0.9248 1.0296
pers_e 1.0357 0.9656 0.9882 1.0855
pers_a 0.9124 1.0960 0.8619 0.9658
pers_n 1.0739 0.9312 1.0146 1.1368
airport_distance 1.0505 0.9519 1.0019 1.1016
republican 1.0471 0.9550 0.9959 1.1009
medage 1.0404 0.9611 0.9994 1.0831
male 1.0086 0.9915 0.9668 1.0522
popdens 0.8776 1.1394 0.8135 0.9468
manufact 1.1078 0.9027 1.0585 1.1594
tourism 0.9296 1.0757 0.8860 0.9753
academics 1.1828 0.8454 1.0931 1.2799
medinc 0.9174 1.0901 0.8586 0.9802
physician_pc 0.9802 1.0202 0.9365 1.0259
Concordance= 0.6 (se = 0.008 )
Likelihood ratio test= 184.8 on 15 df, p=<2e-16
Wald test = 166.6 on 15 df, p=<2e-16
Score (logrank) test = 171.9 on 15 df, p=<2e-16
# predict hazard from personality with controls
cox_cpt_socdist_ctrl2 <- coxph(Surv(cpt_day_socdist, event) ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
cox_cpt_socdist_ctrl2 %>% summary()
Call:
coxph(formula = Surv(cpt_day_socdist, event) ~ pers_o + pers_c +
pers_e + pers_a + pers_n + airport_distance + republican +
medage + male + popdens + manufact + tourism + academics +
medinc + physician_pc + onset_prev + slope_prev, data = df_us_cpt_socdist)
n= 2196, number of events= 2195
(184 observations deleted due to missingness)
coef exp(coef) se(coef) z Pr(>|z|)
pers_o -0.074555 0.928157 0.028688 -2.599 0.009354 **
pers_c -0.025533 0.974790 0.029119 -0.877 0.380560
pers_e 0.036051 1.036709 0.026042 1.384 0.166254
pers_a -0.079471 0.923605 0.031369 -2.533 0.011295 *
pers_n 0.081537 1.084953 0.031671 2.574 0.010040 *
airport_distance 0.051080 1.052407 0.026626 1.918 0.055057 .
republican 0.013368 1.013457 0.026805 0.499 0.617996
medage 0.007390 1.007418 0.022039 0.335 0.737375
male 0.001792 1.001793 0.023217 0.077 0.938489
popdens -0.293911 0.745343 0.068400 -4.297 1.73e-05 ***
manufact 0.118303 1.125585 0.024685 4.792 1.65e-06 ***
tourism -0.073760 0.928894 0.026138 -2.822 0.004773 **
academics 0.156968 1.169958 0.042147 3.724 0.000196 ***
medinc -0.037278 0.963408 0.035395 -1.053 0.292256
physician_pc -0.020296 0.979909 0.024747 -0.820 0.412136
onset_prev 0.003293 1.003299 0.003139 1.049 0.294063
slope_prev -0.869099 0.419329 0.239187 -3.634 0.000280 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
exp(coef) exp(-coef) lower .95 upper .95
pers_o 0.9282 1.0774 0.8774 0.9818
pers_c 0.9748 1.0259 0.9207 1.0320
pers_e 1.0367 0.9646 0.9851 1.0910
pers_a 0.9236 1.0827 0.8685 0.9822
pers_n 1.0850 0.9217 1.0197 1.1544
airport_distance 1.0524 0.9502 0.9989 1.1088
republican 1.0135 0.9867 0.9616 1.0681
medage 1.0074 0.9926 0.9648 1.0519
male 1.0018 0.9982 0.9572 1.0484
popdens 0.7453 1.3417 0.6518 0.8523
manufact 1.1256 0.8884 1.0724 1.1814
tourism 0.9289 1.0765 0.8825 0.9777
academics 1.1700 0.8547 1.0772 1.2707
medinc 0.9634 1.0380 0.8988 1.0326
physician_pc 0.9799 1.0205 0.9335 1.0286
onset_prev 1.0033 0.9967 0.9971 1.0095
slope_prev 0.4193 2.3848 0.2624 0.6701
Concordance= 0.605 (se = 0.008 )
Likelihood ratio test= 189.8 on 17 df, p=<2e-16
Wald test = 172.7 on 17 df, p=<2e-16
Score (logrank) test = 175 on 17 df, p=<2e-16
Linear models predicting mean differences
lm_meandiff_socdist <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n,
data = df_us_cpt_socdist)
lm_meandiff_socdist %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.083345 -0.018086 -0.002951 0.014510 0.175879
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0921830 0.0005616 164.145 < 2e-16 ***
pers_o 0.0106893 0.0006089 17.554 < 2e-16 ***
pers_c -0.0048685 0.0007619 -6.390 1.99e-10 ***
pers_e 0.0042813 0.0006264 6.835 1.04e-11 ***
pers_a -0.0042184 0.0007778 -5.424 6.43e-08 ***
pers_n -0.0030490 0.0007107 -4.290 1.86e-05 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0274 on 2374 degrees of freedom
Multiple R-squared: 0.2192, Adjusted R-squared: 0.2176
F-statistic: 133.3 on 5 and 2374 DF, p-value: < 2.2e-16
lm_meandiff_socdist_ctrl <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.108336 -0.011582 -0.001643 0.010082 0.098895
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.0921830 0.0003778 243.977 < 2e-16 ***
pers_o 0.0020818 0.0004813 4.325 1.59e-05 ***
pers_c -0.0014328 0.0005213 -2.749 0.006028 **
pers_e 0.0015901 0.0004285 3.711 0.000211 ***
pers_a -0.0008177 0.0005497 -1.488 0.137004
pers_n 0.0044056 0.0005238 8.411 < 2e-16 ***
airport_distance -0.0023949 0.0004084 -5.865 5.13e-09 ***
republican -0.0092408 0.0004570 -20.222 < 2e-16 ***
medage 0.0020335 0.0004009 5.072 4.23e-07 ***
male 0.0004270 0.0004170 1.024 0.305979
popdens 0.0046320 0.0004051 11.436 < 2e-16 ***
manufact 0.0004644 0.0004546 1.021 0.307147
tourism 0.0033340 0.0004515 7.385 2.11e-13 ***
academics 0.0051900 0.0007585 6.842 9.91e-12 ***
medinc 0.0132681 0.0006282 21.119 < 2e-16 ***
physician_pc -0.0001920 0.0004176 -0.460 0.645750
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.01843 on 2364 degrees of freedom
Multiple R-squared: 0.6481, Adjusted R-squared: 0.6458
F-statistic: 290.2 on 15 and 2364 DF, p-value: < 2.2e-16
lm_meandiff_socdist_ctrl2 <- lm(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev ,
data = df_us_cpt_socdist)
lm_meandiff_socdist_ctrl2 %>% summary()
Call:
lm(formula = mean_diff_socdist ~ pers_o + pers_c + pers_e + pers_a +
pers_n + airport_distance + republican + medage + male +
popdens + manufact + tourism + academics + medinc + physician_pc +
onset_prev + slope_prev, data = df_us_cpt_socdist)
Residuals:
Min 1Q Median 3Q Max
-0.111040 -0.011493 -0.001667 0.010145 0.075483
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.194e-01 3.741e-03 31.914 < 2e-16 ***
pers_o 1.641e-03 5.132e-04 3.198 0.001405 **
pers_c -1.520e-03 5.382e-04 -2.824 0.004782 **
pers_e 2.020e-03 4.492e-04 4.498 7.23e-06 ***
pers_a -1.349e-03 5.762e-04 -2.342 0.019271 *
pers_n 4.468e-03 5.479e-04 8.155 5.83e-16 ***
airport_distance -1.445e-03 4.359e-04 -3.316 0.000928 ***
republican -8.186e-03 4.740e-04 -17.271 < 2e-16 ***
medage 3.138e-03 4.193e-04 7.485 1.03e-13 ***
male 1.172e-03 4.355e-04 2.691 0.007180 **
popdens 7.177e-03 9.791e-04 7.331 3.21e-13 ***
manufact 3.451e-04 4.655e-04 0.741 0.458640
tourism 2.675e-03 4.683e-04 5.711 1.28e-08 ***
academics 4.908e-03 7.672e-04 6.397 1.93e-10 ***
medinc 1.188e-02 6.481e-04 18.333 < 2e-16 ***
physician_pc -2.821e-04 4.264e-04 -0.662 0.508257
onset_prev -4.036e-04 5.529e-05 -7.300 4.01e-13 ***
slope_prev 1.152e-02 3.088e-03 3.732 0.000195 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.0179 on 2178 degrees of freedom
(184 observations deleted due to missingness)
Multiple R-squared: 0.6593, Adjusted R-squared: 0.6567
F-statistic: 248 on 17 and 2178 DF, p-value: < 2.2e-16
CRF predicting mean difference
ctrls <- cforest_unbiased(ntree=500, mtry=5)
crf_meandiff_socdist <- cforest(mean_diff_socdist ~
pers_o + pers_c + pers_e + pers_a + pers_n +
airport_distance + republican + medage + male + popdens +
manufact + tourism + academics + medinc + physician_pc,
data = df_us_cpt_socdist,
controls = ctrls)
crf_meandiff_socdist_varimp <- varimp(crf_meandiff_socdist, nperm = 1)
crf_meandiff_socdist_varimp_cond <- varimp(crf_meandiff_socdist, conditional = T, nperm = 1)
crf_meandiff_socdist_varimp %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

crf_meandiff_socdist_varimp_cond %>% as.data.frame() %>%
rownames_to_column('variable') %>%
ggplot(aes(x=variable, y=.)) +
geom_bar(stat = 'identity') +
theme(axis.text.x = element_text(angle = 90))

LS0tCnRpdGxlOiAiQ09WSUQtMTkgVVMiCmF1dGhvcjogIkhlaW5yaWNoIFBldGVycyIKZGF0ZTogIjQvMTUvMjAyMCIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKCiMgTUFDCiBrbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVXNlcnMvaHAyNTAwL0dvb2dsZSBEcml2ZS9TVFVEWS9Db2x1bWJpYS9SZXNlYXJjaC9Db3JvbmEvRGF0YS9VUycpCgpsaWJyYXJ5KGxtZXJUZXN0KQpsaWJyYXJ5KG5sbWUpCmxpYnJhcnkocHN5Y2gpCmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkocGFydHkpCmxpYnJhcnkoZG9QYXJhbGxlbCkKbGlicmFyeShjaGFuZ2Vwb2ludCkKbGlicmFyeShzdXJ2aXZhbCkKbGlicmFyeShzdXJ2bWluZXIpCgoKYGBgCgoKIyBQcmVwYXJlIGNvdW50eSBsZXZlbCBkYXRhIAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBwZXJzb25hbGl0eSBkYXRhIApgYGB7ciwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0KCmRmX3VzX3BlcnMgPC0gcmVhZF9jc3YoJ3RpbWVzZXJpZXNfdXNhX2NvdW50eV9tYXJjaDFfYXByaWxfMDkuY3N2JykKCmRmX3VzX3BlcnMgPC0gZGZfdXNfcGVycyAlPiUgc2VsZWN0KGNvdW50eWZpcHMsIG9wZW4sIHNjaSwgZXh0cmEsIGFncmVlLCBzdGFiaWwpICU+JSAKICBtdXRhdGUoc3RhYmlsID0gNi1zdGFiaWwpICU+JQogIGRwbHlyOjpyZW5hbWUoY291bnR5X2ZpcHMgPSBjb3VudHlmaXBzLAogICAgICAgICBwZXJzX28gPSBvcGVuLCAKICAgICAgICAgcGVyc19jID0gc2NpLAogICAgICAgICBwZXJzX2UgPSBleHRyYSwKICAgICAgICAgcGVyc19hID0gYWdyZWUsCiAgICAgICAgIHBlcnNfbiA9IHN0YWJpbCkgJT4lIAogIGRpc3RpbmN0KCkgJT4lCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkKCmRmX3VzX3BlcnMKYGBgCgojIyMgUmVhZCBhbmQgZm9ybWF0IHByZXZhbGVuY2UgZGF0YSAKYGBge3IsIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9CgpkZl91c19wcmV2IDwtIHJlYWRfY3N2KCdVU0FfdGltZXNlcmllc19wcmVwXzIwMDUuY3N2JykKCmRmX3VzX3ByZXYgPC0gZGZfdXNfcHJldiAlPiUgCiAgc2VsZWN0KGZpcHMsIGRhdGUsIHJhdGUpICU+JSAKICBtdXRhdGUoZGF0ZSA9IGFzLkRhdGUoZGF0ZSwgIiVkJWIlWSIpKSAlPiUgCiAgcmVuYW1lKGNvdW50eV9maXBzID0gZmlwcywgCiAgICAgICAgIHJhdGVfZGF5ID0gcmF0ZSkgJT4lCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkKCmRmX3VzX3ByZXYKCmBgYAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBjb3VudHkgbGV2ZWwgY29udHJvbHMgCmBgYHtyfQoKZGZfdXNfY3RybCA8LSByZWFkLmNzdignY29udHJvbHNfVVMuY3N2JykKCmRmX3VzX2N0cmwgPC0gZGZfdXNfY3RybCAlPiUgc2VsZWN0KC1jb3VudHlfbmFtZSkgJT4lIAogIHJlbmFtZShjb3VudHlfZmlwcyA9IGNvdW50eSkgJT4lCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkKCmRmX3VzX2N0cmwKCmBgYAoKIyMjIFJlYWQgYW5kIGZvcm1hdCBzb2NpYWwgZGlzdGFuY2luZyBkYXRhIEZCCmBgYHtyLCB3YXJuaW5nPUZBTFNFLCBtZXNzYWdlPUZBTFNFfQoKZmJfZmlsZXMgPC0gbGlzdC5maWxlcygnLi4vRkIgRGF0YS9VUyBpbmRpdmlkdWFsIGZpbGVzL01vYmlsaXR5LycsCiAgICAgICAgICAgICAgICAgICAgICAgJyouY3N2JywgZnVsbC5uYW1lcyA9IFQpCgpkZl91c19zb2NkaXN0IDwtIGZiX2ZpbGVzICU+JSAKICBtYXAocmVhZF9jc3YpICU+JSBiaW5kX3Jvd3MoKQoKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JQogIHNlbGVjdCgtYWdlX2JyYWNrZXQsIC1nZW5kZXIsIC1iYXNlbGluZV9uYW1lLCAtYmFzZWxpbmVfdHlwZSwgLXBvbHlnb25fbmFtZSkgJT4lCiAgcmVuYW1lKGRhdGUgPSBkcywKICAgICAgICAgY291bnR5X2ZpcHMgPSBwb2x5Z29uX2lkLAogICAgICAgICBzb2NkaXN0X3RpbGVzID0gYWxsX2RheV9iaW5nX3RpbGVzX3Zpc2l0ZWRfcmVsYXRpdmVfY2hhbmdlLAogICAgICAgICBzb2NkaXN0X3NpbmdsZV90aWxlID0gYWxsX2RheV9yYXRpb19zaW5nbGVfdGlsZV91c2VycykgJT4lCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkKCmRmX3VzX3NvY2Rpc3QKCmBgYAoKCiMjIyBNZXJnZSBkYXRhCmBgYHtyfQoKIyBjcmVhdGUgc2VxdWVuY2Ugb2YgZGF0ZXMKZGF0ZV9zZXF1ZW5jZSA8LSBzZXEuRGF0ZShtaW4oZGZfdXNfcHJldiRkYXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtYXgoZGZfdXNfcHJldiRkYXRlKSwgMSkKICAgICAgICAgICAgICAgICAgICAgCiMgY3JlYXRlIGRhdGEgZnJhbWUgd2l0aCB0aW1lIHNlcXVlbmNlCmRmX2RhdGVzID0gZGF0YS5mcmFtZShkYXRlX3NlcXVlbmNlLCAxOmxlbmd0aChkYXRlX3NlcXVlbmNlKSkgCm5hbWVzKGRmX2RhdGVzKSA8LSBjKCdkYXRlJywgJ3RpbWUnKQoKIyBqb2luIGRhdGEgZnJhbWVzIApkZl91c19wcmV2IDwtIGRmX3VzX3ByZXYgJT4lCiAgcGx5cjo6am9pbihkZl91c19jdHJsLCBieT0nY291bnR5X2ZpcHMnKSAlPiUgCiAgcGx5cjo6am9pbihkZl91c19wZXJzLCBieT0nY291bnR5X2ZpcHMnKSAlPiUKICBtZXJnZShkZl9kYXRlcywgYnk9J2RhdGUnKSAlPiUgCiAgYXJyYW5nZShjb3VudHlfZmlwcywgZGF0ZSkKCmRmX3VzX3ByZXYKYGBgCgoKYGBge3J9CgojIGNyZWF0ZSBzZXF1ZW5jZSBvZiBkYXRlcwpkYXRlX3NlcXVlbmNlIDwtIHNlcS5EYXRlKG1pbihkZl91c19zb2NkaXN0JGRhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heChkZl91c19zb2NkaXN0JGRhdGUpLCAxKQogICAgICAgICAgICAgICAgICAgICAKIyBjcmVhdGUgZGF0YSBmcmFtZSB3aXRoIHRpbWUgc2VxdWVuY2UKZGZfZGF0ZXMgPSBkYXRhLmZyYW1lKGRhdGVfc2VxdWVuY2UsIDE6bGVuZ3RoKGRhdGVfc2VxdWVuY2UpKSAKbmFtZXMoZGZfZGF0ZXMpIDwtIGMoJ2RhdGUnLCAndGltZScpCgojIGpvaW4gZGF0YSBmcmFtZXMgCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUKICBwbHlyOjpqb2luKGRmX3VzX2N0cmwsIGJ5PSdjb3VudHlfZmlwcycpICU+JSAKICBwbHlyOjpqb2luKGRmX3VzX3BlcnMsIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIG1lcmdlKGRmX2RhdGVzLCBieT0nZGF0ZScpICU+JSAKICBhcnJhbmdlKGNvdW50eV9maXBzLCBkYXRlKQoKZmlwc19jb21wbGV0ZSA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIHN1bW1hcml6ZShuID0gbigpKSAlPiUgCiAgZmlsdGVyKCEgbjxtYXgobikpICU+JSAuJGNvdW50eV9maXBzCgpkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lCiAgZmlsdGVyKGNvdW50eV9maXBzICVpbiUgZmlwc19jb21wbGV0ZSkKCmRmX3VzX3NvY2Rpc3QKYGBgCgoKCiMjIyBDb250cm9sIGZvciB3ZWVrZW5kIGVmZmVjdCAKYGBge3J9CgpkZl91c19sb2VzcyA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUod2Vla2RheSA9IGZvcm1hdChkYXRlLCAnJXUnKSkgJT4lIAogIGZpbHRlcighd2Vla2RheSAlaW4lIGMoJzYnLCc3JykpICU+JSAKICBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUKICBtYXAofiBsb2Vzcyhzb2NkaXN0X3NpbmdsZV90aWxlIH4gdGltZSwgZGF0YSA9IC4pKSAlPiUKICBtYXAocHJlZGljdCwgMTptYXgoZGZfdXNfc29jZGlzdCR0aW1lKSkgJT4lIAogIGJpbmRfcm93cygpICU+JSAKICBnYXRoZXIoa2V5ID0gJ2NvdW50eV9maXBzJywgdmFsdWUgPSAnbG9lc3MnKSAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUodGltZSA9IHJvd19udW1iZXIoKSkKCmRmX3VzX3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdCAlPiUgbWVyZ2UoZGZfdXNfbG9lc3MsIGJ5PWMoJ2NvdW50eV9maXBzJywgJ3RpbWUnKSkgJT4lIAogIG11dGF0ZSh3ZWVrZGF5ID0gZm9ybWF0KGRhdGUsICcldScpKSAlPiUgCiAgbXV0YXRlKHNvY2Rpc3Rfc2luZ2xlX3RpbGVfY2xlYW4gPSBpZmVsc2Uod2Vla2RheSAlaW4lIGMoJzYnLCc3JyksIGxvZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2Rpc3Rfc2luZ2xlX3RpbGUpKSAlPiUKICBhcnJhbmdlKGNvdW50eV9maXBzLCB0aW1lKSAlPiUgCiAgc2VsZWN0KC13ZWVrZGF5KQoKZGZfdXNfc29jZGlzdCA8LSBkZl91c19zb2NkaXN0ICU+JSBkcm9wX25hKCkgJT4lIG11dGF0ZSh0aW1lID0gdGltZS0xKQoKYGBgCgoKIyMjIFBsb3QgcHJldmFsZW5jZSBvdmVyIHRpbWUKYGBge3J9CgpkZl91c19wcmV2ICU+JSBzYW1wbGVfbigyMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9cmF0ZV9kYXkpKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbD1jb3VudHlfZmlwcywgc2l6ZT1wb3BkZW5zKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2Q9ImxvZXNzIiwgc2U9VCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArCiAgZ2d0aXRsZSgiT3ZlcmFsbCBwcmV2YWxlbmNlIG92ZXIgdGltZSIpCgpwZXJzIDwtIGMoJ3BlcnNfbycsICdwZXJzX2MnLCAncGVyc19lJywgJ3BlcnNfYScsICdwZXJzX24nKQoKZm9yIChpIGluIHBlcnMpewoKZ2cgPC0gZGZfdXNfcHJldiAlPiUgCiAgbXV0YXRlKHByZXZfdGFpbCA9IGN1dCguW1tpXV0sIAogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtSW5mLCBxdWFudGlsZSguW1tpXV0sIDAuMDUsIG5hLnJtPVQpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGUoLltbaV1dLCAwLjk1LCBuYS5ybT1UKSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIocHJldl90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1yYXRlX2RheSkpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIGZhY2V0X3dyYXAofnByZXZfdGFpbCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb249Im5vbmUiKSArIAogIGdndGl0bGUoaSkKCnByaW50KGdnKQp9CgpgYGAKCiMjIyBQbG90IHNvY2lhbCBkaXN0YW5jaW5nIHNpbmdsZSB0aWxlIHZpc2l0ZWQKYGBge3J9CgpkZl91c19zb2NkaXN0ICU+JSBzYW1wbGVfbigxMDAwMCkgJT4lCiAgZ2dwbG90KGFlcyh4PXRpbWUsIHk9c29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sPWNvdW50eV9maXBzLCBzaXplPXBvcGRlbnMpKSArIAogIGdlb21fc21vb3RoKG1ldGhvZD0ibG9lc3MiLCBzZT1UKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKCJPdmVyYWxsIHNvY2lhbCBkaXN0YW5jaW5nIChzaW5nbGUgdGlsZSkgb3ZlciB0aW1lIikKCnBlcnMgPC0gYygncGVyc19vJywgJ3BlcnNfYycsICdwZXJzX2UnLCAncGVyc19hJywgJ3BlcnNfbicpCgpmb3IgKGkgaW4gcGVycyl7CgpnZyA8LSBkZl91c19zb2NkaXN0ICU+JSAKICBtdXRhdGUoZGlzdF90YWlsID0gY3V0KC5bW2ldXSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC1JbmYsIHF1YW50aWxlKC5bW2ldXSwgMC4wNSwgbmEucm0gPSBUKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aWxlKC5bW2ldXSwgMC45NSwgbmEucm0gPSBUKSwgSW5mKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoJ2xvd2VyIHRhaWwnLCAnY2VudGVyJywgJ3VwcGVyIHRhaWwnKSkpICU+JSAKICBmaWx0ZXIoZGlzdF90YWlsICE9ICdjZW50ZXInKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dGltZSwgeT1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2w9Y291bnR5X2ZpcHMsIHNpemU9cG9wZGVucykpICsgCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsb2VzcyIsIHNlPVQpICsgCiAgZmFjZXRfd3JhcCh+ZGlzdF90YWlsKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpICsKICBnZ3RpdGxlKGkpCgpwcmludChnZykKfQoKYGBgCgoKYGBge3J9CgpkZl91c19zb2NkaXN0IDwtIGRmX3VzX3NvY2Rpc3QgJT4lIG11dGF0ZShzb2NkaXN0X3NpbmdsZV90aWxlID0gc29jZGlzdF9zaW5nbGVfdGlsZV9jbGVhbikgJT4lIAogIHNlbGVjdCgtbG9lc3MsIC1zb2NkaXN0X3NpbmdsZV90aWxlX2NsZWFuKQoKYGBgCgojIyMgQ29ycmVsYXRpb25zIApgYGB7cn0KCmRmX3VzX3ByZXYgJT4lIHNlbGVjdCgtdGltZSwgLWRhdGUpICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgc3VtbWFyaXplX2lmKGlzLm51bWVyaWMsIG1lYW4pICU+JSAKICBzZWxlY3QoLWNvdW50eV9maXBzKSAlPiUKICBjb3IodXNlPSdwYWlyd2lzZS5jb21wbGV0ZS5vYnMnKSAlPiUgCiAgcm91bmQoMykgJT4lIGFzLmRhdGEuZnJhbWUoKQoKZGZfdXNfc29jZGlzdCAlPiUgc2VsZWN0KC10aW1lLCAtZGF0ZSkgJT4lIAogIGdyb3VwX2J5KGNvdW50eV9maXBzKSAlPiUKICBzdW1tYXJpemVfaWYoaXMubnVtZXJpYywgbWVhbikgJT4lIAogIHNlbGVjdCgtY291bnR5X2ZpcHMpICU+JQogIGNvcih1c2U9J3BhaXJ3aXNlLmNvbXBsZXRlLm9icycpICU+JSAKICByb3VuZCgzKSAlPiUgYXMuZGF0YS5mcmFtZSgpCiAgCmBgYAoKIyMjIFJlc2NhbGUgRGF0YQpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX3VzX3ByZXYgJT4lIAogIHNlbGVjdCgtdGltZSwgLWRhdGUsIC1yYXRlX2RheSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1jb3VudHlfZmlwcyksIHNjYWxlKQoKbHZsMV9zY2FsZWQgPC0gZGZfdXNfcHJldiAlPiUgc2VsZWN0KGNvdW50eV9maXBzLCB0aW1lLCByYXRlX2RheSkKCmRmX3VzX3ByZXZfc2NhbGVkIDwtIHBseXI6OmpvaW4obHZsMV9zY2FsZWQsIGx2bDJfc2NhbGVkLCBieSA9ICdjb3VudHlfZmlwcycpIAoKYGBgCgpgYGB7cn0KCmx2bDJfc2NhbGVkIDwtIGRmX3VzX3NvY2Rpc3QgJT4lIAogIHNlbGVjdCgtdGltZSwgLWRhdGUsIC1zb2NkaXN0X3RpbGVzLCAtc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lIAogIGRpc3RpbmN0KCkgJT4lIAogIG11dGF0ZV9hdCh2YXJzKC1jb3VudHlfZmlwcyksIHNjYWxlKQoKbHZsMV9zY2FsZWQgPC0gZGZfdXNfc29jZGlzdCAlPiUgc2VsZWN0KGNvdW50eV9maXBzLCB0aW1lLCBzb2NkaXN0X3NpbmdsZV90aWxlKQoKZGZfdXNfc29jZGlzdF9zY2FsZWQgPC0gcGx5cjo6am9pbihsdmwxX3NjYWxlZCwgbHZsMl9zY2FsZWQsIGJ5ID0gJ2NvdW50eV9maXBzJykgCgpgYGAKCiMgUHJlZGljdCBQcmV2YWxlbmNlCiMjIyBFeHRyYWN0IGZpcnN0IGRheSBvZiBjb3ZpZCBvdXRicmVhawpgYGB7cn0KCiMgZ2V0IG9uc2V0IGRheQpkZl91c19vbnNldF9wcmV2IDwtIGRmX3VzX3ByZXZfc2NhbGVkICU+JSAKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lIAogIG11dGF0ZShyYXRlX2NzID0gY3Vtc3VtKHJhdGVfZGF5KSkgJT4lIAogIGZpbHRlcihyYXRlX2NzID4gMCkgJT4lCiAgc3VtbWFyaXplKG9uc2V0X3ByZXYgPSBtaW4odGltZSkpICU+JQogIG11dGF0ZShjb3VudHlfZmlwcyA9IGFzLmNoYXJhY3Rlcihjb3VudHlfZmlwcykpCiAgCiMgbWVyZ2Ugd2l0aCBjb3VudHkgZGF0YQpkZl91c19vbnNldF9wcmV2IDwtIGRmX3VzX3ByZXZfc2NhbGVkICU+JSAKICBzZWxlY3QoLXRpbWUsIC1yYXRlX2RheSkgJT4lCiAgZGlzdGluY3QoKSAlPiUgCiAgbXV0YXRlKGNvdW50eV9maXBzID0gYXMuY2hhcmFjdGVyKGNvdW50eV9maXBzKSkgJT4lCiAgbGVmdF9qb2luKGRmX3VzX29uc2V0X3ByZXYsIGJ5ID0gJ2NvdW50eV9maXBzJykKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfdXNfb25zZXRfcHJldiA8LSBkZl91c19vbnNldF9wcmV2ICU+JSAKICBtdXRhdGUoZXZlbnQgPSBpZmVsc2UoaXMubmEob25zZXRfcHJldiksIDAsIDEpKSAlPiUgCiAgbXV0YXRlKG9uc2V0X3ByZXYgPSByZXBsYWNlX25hKG9uc2V0X3ByZXYsIGFzLm51bWVyaWMoZGlmZihyYW5nZShkZl91c19wcmV2JGRhdGUpKSkrMSkpCgpgYGAKCiMjIyBFeHRyYWN0IHNsb3BlcwpgYGB7cn0KCiMgY3V0IHRpbWUgc2VyaWVzIGJlZm9yZSBvbnNldApkZl91c19wcmV2X3NjYWxlZCA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBtdXRhdGUocmF0ZV9jcyA9IGN1bXN1bShyYXRlX2RheSkpICU+JSAKICBmaWx0ZXIocmF0ZV9jcyA+IDApICU+JQogIG11dGF0ZSh0aW1lID0gdGltZS1taW4odGltZSkrMSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGZpbHRlcih0aW1lIDw9IDMwKSAlPiUKICBzZWxlY3QoLXJhdGVfY3MpCgojIGRyb3AgY291bnRpZXMgd2l0aCBsaXR0bGUgZGF0YQpkZl91c19wcmV2X3NjYWxlZCA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUKICBncm91cF9ieShjb3VudHlfZmlwcykgJT4lCiAgZmlsdGVyKG4oKSA9PSAzMCkgJT4lCiAgdW5ncm91cCgpCgojIGV4dHJhY3Qgc2xvcGUgcHJldmFsZW5jZQpkZl91c19zbG9wZV9wcmV2IDwtIGRmX3VzX3ByZXZfc2NhbGVkICU+JSBzcGxpdCguJGNvdW50eV9maXBzKSAlPiUgCiAgbWFwKH4gbG0ocmF0ZV9kYXkgfiB0aW1lLCBkYXRhID0gLikpICU+JQogIG1hcChjb2VmKSAlPiUgCiAgbWFwX2RibCgndGltZScpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbignY291bnR5X2ZpcHMnKSAlPiUgCiAgcmVuYW1lKHNsb3BlX3ByZXYgPSAnLicpCgojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfc2xvcGVfcHJldiA8LSBkZl91c19wcmV2X3NjYWxlZCAlPiUgCiAgc2VsZWN0KC10aW1lLCAtcmF0ZV9kYXkpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGlubmVyX2pvaW4oZGZfdXNfc2xvcGVfcHJldiwgYnkgPSAnY291bnR5X2ZpcHMnKSAlPiUKICBkcm9wX25hKCkKCmBgYAoKIyMjIEV4cGxvcmUgZGlzdHJpYnV0aW9ucwpgYGB7cn0KCmRmX3VzX29uc2V0X3ByZXYgJT4lIGdncGxvdChhZXMob25zZXRfcHJldikpICsgZ2VvbV9oaXN0b2dyYW0oYmlucyA9IDEwMCkKZGZfdXNfc2xvcGVfcHJldiAlPiUgZ2dwbG90KGFlcyhzbG9wZV9wcmV2KSkgKyBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTAwKQoKYGBgCgojIyBQcmVkaWN0IENPVklEIG9uc2V0IHdpdGggdGltZS10by1ldmVudCByZWdyZXNzaW9uIApgYGB7cn0KCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5CmNveF9vbnNldF9wcmV2IDwtIGNveHBoKFN1cnYob25zZXRfcHJldiwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX29uc2V0X3ByZXYpCmNveF9vbnNldF9wcmV2ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBvbnNldCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X29uc2V0X3ByZXZfY3RybCA8LSBjb3hwaChTdXJ2KG9uc2V0X3ByZXYsIGV2ZW50KSB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19vbnNldF9wcmV2KQpjb3hfb25zZXRfcHJldl9jdHJsICU+JSBzdW1tYXJ5KCkKCmBgYAoKIyMgUHJlZGljdCBwcmV2YWxlbmNlIHNsb3BlcyB3aXRoIGxpbmVhciBtb2RlbHMKYGBge3J9CgojIHByZWRpY3Qgc2xvcGVzIGZyb20gcGVyc29uYWxpdHkKbG1fc2xvcGVfcHJldiA8LSBsbShzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uLCAKICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19zbG9wZV9wcmV2KQpsbV9zbG9wZV9wcmV2ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBzbG9wZXMgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmxtX3Nsb3BlX3ByZXZfY3RybCA8LSBsbShzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX3Nsb3BlX3ByZXYpCmxtX3Nsb3BlX3ByZXZfY3RybCAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIyBDUkYgcHJlZGljdGluZyBzbG9wZXMKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX3Nsb3BlX3ByZXYgPC0gY2ZvcmVzdChzbG9wZV9wcmV2IH4gcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfc2xvcGVfcHJldiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9scyA9IGN0cmxzKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wIDwtIHZhcmltcChjcmZfc2xvcGVfcHJldiwgbnBlcm0gPSAxKQpjcmZfc2xvcGVfcHJldl92YXJpbXBfY29uZCA8LSB2YXJpbXAoY3JmX3Nsb3BlX3ByZXYsIGNvbmRpdGlvbmFsID0gVCwgbnBlcm0gPSAxKQoKY3JmX3Nsb3BlX3ByZXZfdmFyaW1wICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9zbG9wZV9wcmV2X3ZhcmltcF9jb25kICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCgoKIyMgUHJlZGljdCBTb2NpYWwgRGlzdGFuY2luZwojIyMgQ2hhbmdlIHBvaW50IGFuYWx5c2lzCmBgYHtyfQoKIyBrZWVwIG9ubHkgY291bnRpZXMgd2l0aCBmdWxsIGRhdGEKZmlwc19jb21wbGV0ZSA8LSBkZl91c19zb2NkaXN0X3NjYWxlZCAlPiUgCiAgZ3JvdXBfYnkoY291bnR5X2ZpcHMpICU+JSAKICBzdW1tYXJpemUobiA9IG4oKSkgJT4lIAogIGZpbHRlcihuPT1tYXgoLiRuKSkgJT4lIAogIC4kY291bnR5X2ZpcHMKCiMgcnVuIGNoYW5nZXBvaW50IGFuYWx5c2lzCmRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgPC0gZGZfdXNfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdChjb3VudHlfZmlwcywgc29jZGlzdF9zaW5nbGVfdGlsZSkgJT4lCiAgZmlsdGVyKGNvdW50eV9maXBzICVpbiUgZmlwc19jb21wbGV0ZSkgJT4lIAogIHNwbGl0KC4kY291bnR5X2ZpcHMpICU+JQogIG1hcCh+IGNwdC5tZWFudmFyKGFzLnZlY3RvciguJHNvY2Rpc3Rfc2luZ2xlX3RpbGUpLAogICAgICAgICAgICAgICAgICAgICNwZW5hbHR5ID0gJ0FzeW1wdG90aWMnLAogICAgICAgICAgICAgICAgICAgIGNsYXNzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgcGFyYW0uZXN0aW1hdGVzPVRSVUUsCiAgICAgICAgICAgICAgICAgICAgUT0xLAogICAgICAgICAgICAgICAgICAgIHRlc3Quc3RhdCA9ICdOb3JtYWwnKSkKCiMgY2FsY3VsYXRlIGNoYW5nZSBwb2ludApkZl91c19zb2NkaXN0X2NwdF9kYXkgPC0gZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKGNwdHMpICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUoY3B0X2RheV9zb2NkaXN0ID0gJy4nKSAlPiUKICByb3duYW1lc190b19jb2x1bW4oJ2NvdW50eV9maXBzJykKCiMgY2FsY3VsYXRlIG1lYW4gZGlmZmVyZW5jZXMKZGZfdXNfc29jZGlzdF9jcHRfbWVhbl9kaWZmIDwtIGRmX3VzX3NvY2Rpc3RfY3B0X3Jlc3VsdHMgJT4lIAogIG1hcChwYXJhbS5lc3QpICU+JSAKICBtYXAofiAuJG1lYW4pICU+JSAKICBtYXAofiAuWzJdLS5bMV0pICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUobWVhbl9kaWZmX3NvY2Rpc3QgPSAnLicpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbignY291bnR5X2ZpcHMnKQoKIyBjYWxjdWxhdGUgdmFyYWluY2UgZGlmZmVyZW5jZXMKZGZfdXNfc29jZGlzdF9jcHRfdmFyX2RpZmYgPC0gZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cyAlPiUgCiAgbWFwKHBhcmFtLmVzdCkgJT4lIAogIG1hcCh+IC4kdmFyaWFuY2UpICU+JSAKICBtYXAofiAuWzJdLS5bMV0pICU+JSAKICB1bmxpc3QoKSAlPiUgCiAgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByZW5hbWUodmFyX2RpZmZfc29jZGlzdCA9ICcuJykgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCdjb3VudHlfZmlwcycpCgojIG1lcmdlIHdpdGggY291bnR5IGRhdGEKZGZfdXNfY3B0X3NvY2Rpc3QgPC0gZGZfdXNfc29jZGlzdF9zY2FsZWQgJT4lIAogIHNlbGVjdCgtdGltZSwgLXNvY2Rpc3Rfc2luZ2xlX3RpbGUpICU+JQogIGRpc3RpbmN0KCkgJT4lIAogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9kYXksIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF9tZWFuX2RpZmYsIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihkZl91c19zb2NkaXN0X2NwdF92YXJfZGlmZiwgYnk9J2NvdW50eV9maXBzJykgJT4lCiAgbGVmdF9qb2luKHNlbGVjdChkZl91c19vbnNldF9wcmV2LCBjb3VudHlfZmlwcywgb25zZXRfcHJldiksIGJ5PSdjb3VudHlfZmlwcycpICU+JQogIGxlZnRfam9pbihzZWxlY3QoZGZfdXNfc2xvcGVfcHJldiwgY291bnR5X2ZpcHMsIHNsb3BlX3ByZXYpLCBieT0nY291bnR5X2ZpcHMnKSAKCiMgaGFuZGxlIGNlbnNvcmVkIGRhdGEKZGZfdXNfY3B0X3NvY2Rpc3QgPC0gZGZfdXNfY3B0X3NvY2Rpc3QgJT4lIAogIG11dGF0ZShjcHRfZGF5X3NvY2Rpc3QgPSBpZmVsc2UoaXMubmEoY3B0X2RheV9zb2NkaXN0KSwgYXMubnVtZXJpYyhkaWZmKHJhbmdlKGRmX3VzJGRhdGUpKSksIGNwdF9kYXlfc29jZGlzdCkpICU+JSAKICBtdXRhdGUoZXZlbnQgPSBpZmVsc2UoY3B0X2RheV9zb2NkaXN0ID49IDYwLCAwLCAxKSkKCmBgYAoKCmBgYHtyfQpkZl91c19jcHRfc29jZGlzdCRjcHRfZGF5X3NvY2Rpc3QgJT4lIGhpc3QoKQpkZl91c19jcHRfc29jZGlzdCRtZWFuX2RpZmZfc29jZGlzdCAlPiUgaGlzdCgpCmRmX3VzX2NwdF9zb2NkaXN0JHZhcl9kaWZmX3NvY2Rpc3QgJT4lIGhpc3QoKQoKYGBgCgpgYGB7cn0KCmZvcihpIGluIGhlYWQoZGZfdXNfc29jZGlzdF9jcHRfcmVzdWx0cywgNSkpewogIHBsb3QoaSkKfQoKYGBgCgoKIyBQcmVkaWN0aW5nIGNoYW5nZSBwb2ludHMgd2l0aCB0aW1lLXRvLWV2ZW50IHJlZ3Jlc3Npb24gCmBgYHtyfQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5CmNveF9jcHRfc29jZGlzdCA8LSBjb3hwaChTdXJ2KGNwdF9kYXlfc29jZGlzdCwgZXZlbnQpIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0ICU+JSBzdW1tYXJ5KCkKCiMgcHJlZGljdCBoYXphcmQgZnJvbSBwZXJzb25hbGl0eSB3aXRoIGNvbnRyb2xzCmNveF9jcHRfc29jZGlzdF9jdHJsIDwtIGNveHBoKFN1cnYoY3B0X2RheV9zb2NkaXN0LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzX28gKyBwZXJzX2MgKyBwZXJzX2UgKyBwZXJzX2EgKyBwZXJzX24gKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlycG9ydF9kaXN0YW5jZSArIHJlcHVibGljYW4gKyBtZWRhZ2UgKyBtYWxlICsgcG9wZGVucyArIAogICAgICAgICAgICAgICAgICAgICAgICAgICBtYW51ZmFjdCArIHRvdXJpc20gKyBhY2FkZW1pY3MgKyBtZWRpbmMgKyBwaHlzaWNpYW5fcGMsCiAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKY294X2NwdF9zb2NkaXN0X2N0cmwgJT4lIHN1bW1hcnkoKQoKIyBwcmVkaWN0IGhhemFyZCBmcm9tIHBlcnNvbmFsaXR5IHdpdGggY29udHJvbHMKY294X2NwdF9zb2NkaXN0X2N0cmwyIDwtIGNveHBoKFN1cnYoY3B0X2RheV9zb2NkaXN0LCBldmVudCkgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFudWZhY3QgKyB0b3VyaXNtICsgYWNhZGVtaWNzICsgbWVkaW5jICsgcGh5c2ljaWFuX3BjICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgb25zZXRfcHJldiArIHNsb3BlX3ByZXYgLAogICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmNveF9jcHRfc29jZGlzdF9jdHJsMiAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIyBMaW5lYXIgbW9kZWxzIHByZWRpY3RpbmcgbWVhbiBkaWZmZXJlbmNlcwpgYGB7cn0KCmxtX21lYW5kaWZmX3NvY2Rpc3QgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gZGZfdXNfY3B0X3NvY2Rpc3QpCmxtX21lYW5kaWZmX3NvY2Rpc3QgJT4lIHN1bW1hcnkoKQoKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsIDwtIGxtKG1lYW5fZGlmZl9zb2NkaXN0IH4gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsICU+JSBzdW1tYXJ5KCkKCmxtX21lYW5kaWZmX3NvY2Rpc3RfY3RybDIgPC0gbG0obWVhbl9kaWZmX3NvY2Rpc3QgfiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcnNfbyArIHBlcnNfYyArIHBlcnNfZSArIHBlcnNfYSArIHBlcnNfbiArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhaXJwb3J0X2Rpc3RhbmNlICsgcmVwdWJsaWNhbiArIG1lZGFnZSArIG1hbGUgKyBwb3BkZW5zICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uc2V0X3ByZXYgKyBzbG9wZV9wcmV2ICwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkZl91c19jcHRfc29jZGlzdCkKbG1fbWVhbmRpZmZfc29jZGlzdF9jdHJsMiAlPiUgc3VtbWFyeSgpCgpgYGAKCiMjIyBDUkYgcHJlZGljdGluZyBtZWFuIGRpZmZlcmVuY2UKYGBge3J9CgpjdHJscyA8LSBjZm9yZXN0X3VuYmlhc2VkKG50cmVlPTUwMCwgbXRyeT01KQoKY3JmX21lYW5kaWZmX3NvY2Rpc3QgPC0gY2ZvcmVzdChtZWFuX2RpZmZfc29jZGlzdCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyc19vICsgcGVyc19jICsgcGVyc19lICsgcGVyc19hICsgcGVyc19uICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpcnBvcnRfZGlzdGFuY2UgKyByZXB1YmxpY2FuICsgbWVkYWdlICsgbWFsZSArIHBvcGRlbnMgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbnVmYWN0ICsgdG91cmlzbSArIGFjYWRlbWljcyArIG1lZGluYyArIHBoeXNpY2lhbl9wYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGRmX3VzX2NwdF9zb2NkaXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbHMgPSBjdHJscykKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCA8LSB2YXJpbXAoY3JmX21lYW5kaWZmX3NvY2Rpc3QsIG5wZXJtID0gMSkKY3JmX21lYW5kaWZmX3NvY2Rpc3RfdmFyaW1wX2NvbmQgPC0gdmFyaW1wKGNyZl9tZWFuZGlmZl9zb2NkaXN0LCBjb25kaXRpb25hbCA9IFQsIG5wZXJtID0gMSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcCAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSAKICByb3duYW1lc190b19jb2x1bW4oJ3ZhcmlhYmxlJykgJT4lCiAgZ2dwbG90KGFlcyh4PXZhcmlhYmxlLCB5PS4pKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwKSkKCmNyZl9tZWFuZGlmZl9zb2NkaXN0X3ZhcmltcF9jb25kICU+JSBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigndmFyaWFibGUnKSAlPiUKICBnZ3Bsb3QoYWVzKHg9dmFyaWFibGUsIHk9LikpICsKICBnZW9tX2JhcihzdGF0ID0gJ2lkZW50aXR5JykgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTApKQoKYGBgCg==